// unicode与字符编码
package main

import "fmt"

func test1() {
	//一个rune类型的值由四个字节宽度的空间来存储
	str := "你好 ABC "
	fmt.Printf("string: %q\n", str) //"你好 ABC "

	//字符串值如果被转换为[]rune类型的值，其中的每一个字符（不论是英文字符还是中文字符）就都会独立成为一个rune类型的元素值。
	fmt.Printf("runes(char): %q\n", []rune(str)) // ['你' '好' ' ' 'A' 'B' 'C' ' ']

	//每个rune类型的值在底层都是由一个 UTF-8 编码值来表达的
	//中文字符的UTF-8编码值用三个字节来表达,所以前面两个中文对应的编码值会比较大;
	//英文字符的UTF-8编码值用一个字节表达就足够了,所以编码值被转换为整数之后比较小;
	fmt.Printf("runes(hex): %x\n", []rune(str)) // [4f60 597d 20 41 42 43 20]

	//把每个字符的UTF-8编码值都拆成相应的字节序列
	//结果变长了,是因为一个中文字符的UTF-8编码值需要用三个字节来表达。
	fmt.Printf("bytes(hex): [% x]\n", []byte(str)) //[e4 bd a0 e5 a5 bd 20 41 42 43 20]
}

func test2() {
	str := "你好 ABC "
	for i, c := range str {
		fmt.Printf("%d: %q [%x]\n", i, c, []byte(string(c)))
	}
	/*
		0: '你' [e4 bd a0]
		3: '好' [e5 a5 bd]
		6: ' ' [20]
		7: 'A' [41] //字符是A的十六进制表示为41
		8: 'B' [42]
		9: 'C' [43]
		10: ' ' [20]
	*/

}
func main() {
	test1()
	test2()
}
